
const num = 1
export default num

// 发布-订阅设计模式
// 实现事件封装
interface EventList {
	[propsName: string]: Function[]
}

class Event {
	// 事件对象容器
	eventList: EventList = {}
	// 绑定事件
	on(eventType: string, callback: Function) {
		// 判断事件事件是否存在
		if (!this.eventList[eventType]) {
			// 不存在 将这种类型的事件 赋值空数组
			this.eventList[eventType] = []
		}
		// 添加事件回调
		this.eventList[eventType].push(callback)
	}
	// 触发事件
	emit(eventType: string) {
		// 判断事件事件是否存在
		if (this.eventList[eventType]) {
			// 执行所有的事件回调
			this.eventList[eventType].forEach(callback => {
				callback()
			})
		} else {
			// 没有该事件  警告提示
			console.warn('很遗憾， 未找到自定义事件' + eventType)
		}
	}
	// 解除事件
	off(eventType: string, callback?: Function) {
		// 是否解除所有事件
		if (typeof callback === 'undefined') {
			// 删除对象属性
			delete this.eventList[eventType]
		} else if (this.eventList[eventType]) {
			this.delete(eventType, callback)
		}
	}
	// 绑定事件 只会触发一次
	once(eventType: string, callback: Function) {
		if (!this.eventList[eventType]) {
			this.eventList[eventType] = []
		}

		const fn = () => {
			callback()
			this.delete(eventType, fn)
		}

		this.eventList[eventType].push(fn)
	}
	
	delete(eventType: string, callback: Function) {
		if (this.eventList[eventType]) {
			this.eventList[eventType] = this.eventList[eventType].filter(v => {
				return v !== callback
			})
		}
	}


}

const ev = new Event();

const say = () => {
	console.log('handleClick 自定义事件执行')
}

ev.once('handleClick', say)
ev.once('handleClick', () => {
	console.log(123)
})
ev.on('handleClick', () => {
	console.log('哈哈哈')
})

ev.emit('handleClick')
console.log('-------------------------------------------------------------')
ev.emit('handleClick')


